/*!
 * \file ActionPolicyMgr.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief 动作策略管理器头文件
 * 
 * 动作策略管理器是WonderTrader系统中用于管理交易动作策略的组件，
 * 主要功能包括：
 * 1. 定义和管理不同类型的交易动作（开仓、平仓等）
 * 2. 配置和管理动作规则（限制条件、数量限制等）
 * 3. 根据品种ID获取对应的动作规则组
 * 4. 支持品种级别的规则映射和默认规则
 * 
 * 该组件为交易执行提供策略级别的动作控制和风险管理。
 */
#pragma once
#include <vector>
#include <stdint.h>
#include <string.h>

#include "../Includes/FasterDefs.h"


NS_WTP_BEGIN
class WTSVariant;

/**
 * @enum ActionType
 * @brief 交易动作类型枚举
 * 
 * 定义了系统支持的各种交易动作类型，用于区分不同的交易操作
 */
typedef enum tagActionType
{
	AT_Unknown = 8888,		///< 未知动作类型
	AT_Open = 9999,			///< 开仓动作
	AT_Close,				///< 平仓动作
	AT_CloseToday,			///< 平今动作
	AT_CloseYestoday		///< 平昨动作
} ActionType;

/**
 * @struct _ActionRule
 * @brief 动作规则结构体
 * 
 * 定义了单个动作规则的所有属性，包括动作类型、数量限制等
 */
typedef struct _ActionRule
{
	ActionType	_atype;		///< 动作类型
	uint32_t	_limit;		///< 总数量限制
	uint32_t	_limit_l;	///< 多头数量限制
	uint32_t	_limit_s;	///< 空头数量限制
	bool		_pure;		///< 是否纯净模式（仅对AT_CloseToday和AT_CloseYestoday有效，决定是否是纯净的只平今或只平昨）

	/**
	 * @brief 默认构造函数
	 * 
	 * 将所有成员变量初始化为0
	 */
	_ActionRule()
	{
		memset(this, 0, sizeof(_ActionRule));
	}
} ActionRule;

/**
 * @typedef ActionRuleGroup
 * @brief 动作规则组类型定义
 * 
 * 一个动作规则组包含多个动作规则，用于管理一组相关的交易动作策略
 */
typedef std::vector<ActionRule>	ActionRuleGroup;

/**
 * @class ActionPolicyMgr
 * @brief 动作策略管理器类
 * 
 * 动作策略管理器负责管理系统中的所有交易动作策略：
 * 1. 从配置文件加载动作规则
 * 2. 管理不同品种的动作规则映射
 * 3. 提供根据品种ID查询动作规则的接口
 * 4. 支持默认规则和品种特定规则
 * 
 * 该类为交易执行模块提供策略级别的动作控制，
 * 确保交易操作符合预设的风险控制规则。
 */
class ActionPolicyMgr
{
public:
	/**
	 * @brief 构造函数
	 * 
	 * 初始化动作策略管理器
	 */
	ActionPolicyMgr();
	
	/**
	 * @brief 析构函数
	 * 
	 * 清理动作策略管理器资源
	 */
	~ActionPolicyMgr();

public:
	/**
	 * @brief 初始化动作策略管理器
	 * @param filename 配置文件路径
	 * @return 是否初始化成功
	 * 
	 * 从指定的配置文件加载动作策略规则：
	 * 1. 解析配置文件中的规则组
	 * 2. 加载每个规则组的动作规则
	 * 3. 建立品种到规则组的映射关系
	 */
	bool init(const char* filename);

	/**
	 * @brief 获取指定品种的动作规则组
	 * @param pid 品种ID
	 * @return 对应的动作规则组引用
	 * 
	 * 根据品种ID查找对应的动作规则组：
	 * 1. 首先查找品种特定的规则映射
	 * 2. 如果没有找到，则使用默认规则组
	 * 3. 返回规则组的常量引用
	 */
	const ActionRuleGroup& getActionRules(const char* pid);

private:
	typedef faster_hashmap<ShortKey, ActionRuleGroup> RulesMap;
	RulesMap	_rules;		///< 规则组映射表，键为规则组名称，值为动作规则组

	faster_hashmap<ShortKey, std::string> _comm_rule_map;	///< 品种规则映射表，键为品种ID，值为规则组名称
};

NS_WTP_END
